#!/bin/bash

# RTX 4060Ti 16G显卡矿卡检测脚本
# 作者：AI助手
# 功能：检测显卡是否曾被用于挖矿

# 显示彩色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# 打印标题
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE}     RTX 4060Ti 16G 矿卡检测工具         ${NC}"
echo -e "${BLUE}============================================${NC}"
echo ""

# 检查是否为root用户
if [ "$EUID" -ne 0 ]; then
  echo -e "${RED}请使用root权限运行此脚本：sudo $0${NC}"
  exit 1
fi

# 确认用户意愿
echo -e "${YELLOW}此脚本将运行一系列测试来检测显卡是否曾被用于挖矿。${NC}"
echo -e "${RED}警告：测试过程会使显卡满载并升温，请确保散热良好。${NC}"
read -p "确定要继续吗？(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  echo -e "${RED}操作已取消${NC}"
  exit 1
fi

# 检查NVIDIA驱动是否存在
echo -e "\n${GREEN}[步骤1] 检查NVIDIA驱动${NC}"
if ! command -v nvidia-smi &> /dev/null; then
  echo -e "${RED}未检测到NVIDIA驱动，请先安装驱动。${NC}"
  echo -e "${YELLOW}提示：可以运行 gpu_verify.sh 脚本安装驱动。${NC}"
  exit 1
fi

# 安装必要的测试工具
echo -e "\n${GREEN}[步骤2] 安装必要的测试工具${NC}"
echo "更新软件源..."
apt update

echo "安装基础工具包..."
apt install -y nvidia-cuda-toolkit stress-ng mesa-utils smartmontools bc

# 基本信息收集
echo -e "\n${GREEN}[步骤3] 收集基本信息${NC}"
echo -e "${YELLOW}显卡信息:${NC}"
nvidia-smi
echo ""

# 检查风扇和温度
echo -e "\n${GREEN}[步骤4] 风扇状态与温度检查${NC}"
echo -e "${YELLOW}风扇转速与温度:${NC}"
nvidia-settings -q "[fan:0]/GPUCurrentFanSpeed" -q "[thermalsensor:0]/ThermalSensorReading" 2>/dev/null || echo -e "${RED}无法读取风扇转速，可能需要安装nvidia-settings${NC}"

# 记录基础状态
echo -e "\n${GREEN}[步骤5] 记录基础状态${NC}"
BASE_TEMP=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader)
BASE_POWER=$(nvidia-smi --query-gpu=power.draw --format=csv,noheader | sed 's/ W//')
BASE_FAN=$(nvidia-settings -q "[fan:0]/GPUCurrentFanSpeed" 2>/dev/null | grep Attribute | awk '{print $4}' | sed 's/\.//')

echo -e "${YELLOW}基础温度: ${BASE_TEMP}°C${NC}"
echo -e "${YELLOW}基础功耗: ${BASE_POWER}W${NC}"
if [ ! -z "$BASE_FAN" ]; then
  echo -e "${YELLOW}基础风扇转速: ${BASE_FAN}%${NC}"
fi

# 启动监控
start_monitoring() {
  echo -e "\n${GREEN}启动监控...${NC}"
  gnome-terminal -- bash -c "nvidia-smi dmon -s pucvmet -i 0 -d 1" &
  MONITOR_PID=$!
  echo $MONITOR_PID > /tmp/mining_monitor_pid
  sleep 2
}

# 停止监控
stop_monitoring() {
  if [ -f /tmp/mining_monitor_pid ]; then
    MONITOR_PID=$(cat /tmp/mining_monitor_pid)
    kill $MONITOR_PID 2>/dev/null
    rm /tmp/mining_monitor_pid
  fi
}

# 运行连续性能测试
echo -e "\n${GREEN}[步骤6] 运行连续性能测试${NC}"
echo -e "${YELLOW}此测试将连续运行3次性能测试，并比较性能波动。${NC}"
echo -e "${YELLOW}矿卡通常会在多次连续负载后出现显著性能下降。${NC}"
read -p "按回车键开始测试..." -n 1 -r

# 启动监控
start_monitoring

# 创建测试结果文件
RESULTS_FILE="/tmp/mining_test_results.txt"
> $RESULTS_FILE

# 进行三轮测试
for i in {1..3}; do
  echo -e "\n${GREEN}第 $i 轮测试${NC}"
  
  # 运行CUDA核心测试
  echo "运行CUDA核心测试..."
  TEST_START=$(date +%s)
  
  # 使用nvidia-smi设置持续负载
  echo "设置持续负载..."
  stress-ng --gpu 1 --timeout 2m &
  STRESS_PID=$!
  
  # 等待负载稳定
  sleep 30
  
  # 记录当前状态
  CUR_TEMP=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader)
  CUR_POWER=$(nvidia-smi --query-gpu=power.draw --format=csv,noheader | sed 's/ W//')
  CUR_CLOCK=$(nvidia-smi --query-gpu=clocks.gr --format=csv,noheader | sed 's/ MHz//')
  
  # 记录结果
  echo "Round $i Temperature: $CUR_TEMP°C" >> $RESULTS_FILE
  echo "Round $i Power: $CUR_POWER W" >> $RESULTS_FILE
  echo "Round $i Clock: $CUR_CLOCK MHz" >> $RESULTS_FILE
  
  # 打印当前状态
  echo -e "${YELLOW}当前温度: ${CUR_TEMP}°C${NC}"
  echo -e "${YELLOW}当前功耗: ${CUR_POWER}W${NC}"
  echo -e "${YELLOW}当前核心频率: ${CUR_CLOCK}MHz${NC}"
  
  # 等待测试完成
  wait $STRESS_PID
  
  # 冷却时间
  if [ $i -lt 3 ]; then
    echo -e "${BLUE}冷却时间30秒...${NC}"
    sleep 30
  fi
done

# 停止监控
stop_monitoring

# 分析测试结果
echo -e "\n${GREEN}[步骤7] 分析测试结果${NC}"

# 读取三轮测试数据
TEMP1=$(grep "Round 1 Temperature" $RESULTS_FILE | awk '{print $4}' | sed 's/°C//')
TEMP2=$(grep "Round 2 Temperature" $RESULTS_FILE | awk '{print $4}' | sed 's/°C//')
TEMP3=$(grep "Round 3 Temperature" $RESULTS_FILE | awk '{print $4}' | sed 's/°C//')

POWER1=$(grep "Round 1 Power" $RESULTS_FILE | awk '{print $4}')
POWER2=$(grep "Round 2 Power" $RESULTS_FILE | awk '{print $4}')
POWER3=$(grep "Round 3 Power" $RESULTS_FILE | awk '{print $4}')

CLOCK1=$(grep "Round 1 Clock" $RESULTS_FILE | awk '{print $4}')
CLOCK2=$(grep "Round 2 Clock" $RESULTS_FILE | awk '{print $4}')
CLOCK3=$(grep "Round 3 Clock" $RESULTS_FILE | awk '{print $4}')

# 计算温度变化
TEMP_CHANGE1=$(echo "scale=2; $TEMP2 - $TEMP1" | bc)
TEMP_CHANGE2=$(echo "scale=2; $TEMP3 - $TEMP2" | bc)

# 计算频率变化百分比
if [ ! -z "$CLOCK1" ] && [ ! -z "$CLOCK3" ] && [ "$CLOCK1" != "0" ]; then
  CLOCK_PERCENT=$(echo "scale=2; ($CLOCK3 - $CLOCK1) * 100 / $CLOCK1" | bc)
else
  CLOCK_PERCENT="N/A"
fi

# 输出分析结果
echo -e "${YELLOW}测试结果分析:${NC}"
echo -e "温度变化: 第1轮 → 第2轮: ${TEMP_CHANGE1}°C, 第2轮 → 第3轮: ${TEMP_CHANGE2}°C"
echo -e "频率变化百分比(第1轮→第3轮): ${CLOCK_PERCENT}%"

# 矿卡评分系统 (0-100, 0=正常卡, 100=极可能是矿卡)
MINING_SCORE=0

# 评分逻辑
# 1. 温度不稳定 (波动大)
if (( $(echo "$TEMP_CHANGE1 > 5" | bc -l) )) || (( $(echo "$TEMP_CHANGE2 > 5" | bc -l) )); then
  MINING_SCORE=$((MINING_SCORE + 20))
  echo -e "${RED}[警告] 温度波动大，可能是散热器受损${NC}"
fi

# 2. 频率下降明显
if [ "$CLOCK_PERCENT" != "N/A" ]; then
  if (( $(echo "$CLOCK_PERCENT < -10" | bc -l) )); then
    MINING_SCORE=$((MINING_SCORE + 40))
    echo -e "${RED}[警告] 持续负载后频率下降明显，常见于矿卡${NC}"
  elif (( $(echo "$CLOCK_PERCENT < -5" | bc -l) )); then
    MINING_SCORE=$((MINING_SCORE + 20))
    echo -e "${YELLOW}[注意] 持续负载后频率有轻微下降${NC}"
  fi
fi

# 3. 最高温度异常
MAX_TEMP=$(echo -e "$TEMP1\n$TEMP2\n$TEMP3" | sort -nr | head -n1)
if (( $(echo "$MAX_TEMP > 85" | bc -l) )); then
  MINING_SCORE=$((MINING_SCORE + 20))
  echo -e "${RED}[警告] 最高温度过高(${MAX_TEMP}°C)，可能是散热器受损${NC}"
fi

# 4. 功耗不稳定
POWER_DIFF=$(echo "scale=2; ($POWER3 - $POWER1)" | bc)
if (( $(echo "sqrt($POWER_DIFF * $POWER_DIFF) > 20" | bc -l) )); then
  MINING_SCORE=$((MINING_SCORE + 20))
  echo -e "${RED}[警告] 功耗波动大，可能是电源管理受损${NC}"
fi

# 生成测试报告
echo -e "\n${GREEN}[步骤8] 生成测试报告${NC}"
REPORT_FILE="mining_test_report_$(date +%Y%m%d_%H%M%S).txt"

{
  echo "RTX 4060Ti 16G矿卡检测报告"
  echo "=========================="
  echo "测试时间: $(date)"
  echo ""
  echo "基本信息:"
  nvidia-smi
  echo ""
  echo "测试结果:"
  cat $RESULTS_FILE
  echo ""
  echo "分析结果:"
  echo "温度变化: 第1轮→第2轮: ${TEMP_CHANGE1}°C, 第2轮→第3轮: ${TEMP_CHANGE2}°C"
  echo "频率变化百分比(第1轮→第3轮): ${CLOCK_PERCENT}%"
  echo "矿卡可能性评分(0-100): $MINING_SCORE"
  echo ""
  echo "矿卡评分标准:"
  echo "0-20: 可能是正常显卡"
  echo "21-50: 有一定矿卡可能性，建议进一步检查"
  echo "51-80: 较高矿卡可能性，谨慎购买"
  echo "81-100: 极可能是矿卡，不建议购买"
} > "$REPORT_FILE"

echo -e "${GREEN}测试报告已保存至: $REPORT_FILE${NC}"

# 结论
echo -e "\n${BLUE}[测试结论]${NC}"
echo -e "${YELLOW}矿卡可能性评分(0-100): $MINING_SCORE${NC}"

if [ $MINING_SCORE -le 20 ]; then
  echo -e "${GREEN}结论: 可能是正常显卡，各项指标正常${NC}"
elif [ $MINING_SCORE -le 50 ]; then
  echo -e "${YELLOW}结论: 有一定矿卡可能性，建议进一步检查${NC}"
elif [ $MINING_SCORE -le 80 ]; then
  echo -e "${RED}结论: 较高矿卡可能性，谨慎购买${NC}"
else
  echo -e "${RED}结论: 极可能是矿卡，不建议购买${NC}"
fi

echo -e "\n${BLUE}矿卡特征:${NC}"
echo "1. 持续负载后频率下降明显（>10%）"
echo "2. 温度波动大或明显高于正常水平"
echo "3. 功耗不稳定或远低于正常水平"
echo "4. 风扇噪音大或转速异常高"
echo "5. 显存错误率高或显存性能低"

echo -e "\n${GREEN}感谢使用RTX 4060Ti 16G矿卡检测工具!${NC}" 